package java_thinking.unit_21.concurrentutil;

import sun.misc.Unsafe;

import java.lang.reflect.Field;

/**
 * @Desc:       1.我们无法直接使用Unsafe类，Unsafe 类是 rt.jar 包提供的， rt.jar 包里面的类是使用 Bootstrap 类加载器加载的，
 *                而我们的启动 maindemo 函数所在 的 类是使用 AppClassLoader 加载的，所以在 maindemo 函数里面加载 Unsafe 类时，根
 *                据委托机制， 会委托给 Bootstrap 去加载 Unsafe 类。
 *              2.若要使用则使用反射，或者可以修改-Xbootclasspath参数，将我们的代码所在的路径添加进去；
 *
 * @author: cww
 * @DateTime: 2019-08-11 14:21
 */

public class UnsafeTheory {

    static Unsafe unsafe;
    static long stateOffset;
    private volatile long state = 0;
    static {
        try {
            //使用反射获取 Unsafe 的成员变量 theUnsafe
            Field field = Unsafe.class.getDeclaredField("theUnsafe");
            //设置为可存取
            field.setAccessible(true);
            //通过字段获取对象,字段如果不是静态字段,要传入反射类的对象，但是如果字段是静态字段,传入任何对象都是可以的；
            unsafe = (Unsafe) field.get(null);
            stateOffset = unsafe.objectFieldOffset(UnsafeTheory.class.getDeclaredField("state"));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        UnsafeTheory theory = new UnsafeTheory();
        Boolean aBoolean = unsafe.compareAndSwapInt(theory, stateOffset, 0, 1);
        System.out.println(aBoolean);
    }
}
